package com.bookrecomm.dao;

import com.bookrecomm.entity.Tag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 标签数据访问接口
 * 提供图书标签相关的数据库操作方法
 */
@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {

    /**
     * 根据标签名称查找标签
     * @param name 标签名称
     * @return 标签对象（可能为空）
     */
    Optional<Tag> findByName(String name);

    /**
     * 检查标签名称是否已存在
     * @param name 标签名称
     * @return 是否存在
     */
    boolean existsByName(String name);

    /**
     * 根据状态查询标签
     * @param status 状态（0-禁用，1-正常）
     * @return 标签列表
     */
    List<Tag> findByStatus(Integer status);

    /**
     * 根据热度排序查询标签
     * @param limit 限制数量
     * @return 标签列表
     */
    @Query("SELECT t FROM Tag t WHERE t.status = 1 ORDER BY t.heat DESC")
    List<Tag> findHotTags(@Param("limit") int limit);

    /**
     * 查询某本书的所有标签
     * @param bookId 图书ID
     * @return 标签列表
     */
    @Query("SELECT t FROM Tag t JOIN t.books b WHERE b.id = :bookId AND t.status = 1")
    List<Tag> findTagsByBookId(@Param("bookId") Long bookId);

    /**
     * 根据名称模糊查询标签
     * @param name 标签名称关键词
     * @return 标签列表
     */
    List<Tag> findByNameContainingAndStatus(String name, Integer status);
}
